package com.dylan.历史.多线程.并发编程的艺术.编程基础;

import com.dylan.历史.util.LogUtil;

/**
 * Created by Dylan on 2018/7/16.
 */
public class 等待超时 {

    public static void main(String[] args) {
        LogUtil.info("开始获取结果");
        LogUtil.info("获取到的结果：" + getResult(2000));
    }

    private static final Object lock = new Object();
    private static Object result;

    /**
     * 在一定时间内返回,如果超时后还是没有得到结果,则返回默认值
     * @param millis 超时时长
     * @return 结果
     */
    public static Object getResult(long millis) {
        synchronized (lock) {
            // 等待最长的未来时间
            long future = System.currentTimeMillis() + millis;
            // 等待时间
            long remaining = millis;
            // 循环等待,如果有线程进行了notify,则可以继续等待
            while (result == null && remaining > 0) {
                try {
                    lock.wait(remaining);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                remaining = future - System.currentTimeMillis();
            }
            return result;
        }
    }
}
